################################################################################
# simple cache validation
################################################################################

class HelloController < ServerSide::Controller.mount ('/hello')
  def response
    request.validate_cache(Time.now, 3.weeks) do
      render_view 'hello.rhtml', :layout => 'default.rhtml'
    end
  end
end

################################################################################
# cache with all parameters
################################################################################

class PostsController < ServerSide::ActionController
  def index
    @session = Sessions.by_sid(cookies[:sid])
    @posts = Posts.order_by_stamp_DESC.all_by_user(@session[:user])
  
    request.validate_cache(@posts.first[:stamp], 3.days, 'xxx-yyy', :private) do
      render_view 'posts'
    end
  end
end

################################################################################
# custom etag validation
################################################################################

class Reality::Controller
  def validate_expiry_etag
    request.validate_etag do |etag|
      if etag =~ /(\d+)-(\d+)/
        stamp, expires = Time.at($1), Time.at($2)
        expires < Time.now
      end
    end
  end

  def expiry_etag(stamp, valid_period)
    "%d-%d" % [stamp, valid_period]
  end
  
  def process
    before_response if respond_to?(:before_response)
    send(params[:flavor] || params[:f]) unless request.@rendered
  end
end

class HistoryController < Reality::Controller
  def before_response
    @node = Nodes[@path]
    return if validate_expiry_etag
    @states = @node.states.filter(:stamp => (@start..@stop)).all
    stamp = @states.first[:stamp]
    valid_period = @node.sample_rate
    request.validate_cache(stamp, valid_period, 
      expiry_etag(stamp, @node.sample_))
  end
  
  def xml
    render_xml {
      states {@states.to_xml(:session)}
    }
  end
  
  def json
    render_json {
      states {@states.to_json}
    }
end


